package cn.itcast.service.cargo.impl;

import cn.itcast.dao.cargo.ContractDao;
import cn.itcast.dao.cargo.ExtCproductDao;
import cn.itcast.domain.cargo.Contract;
import cn.itcast.domain.cargo.ExtCproduct;
import cn.itcast.domain.cargo.ExtCproductExample;
import cn.itcast.service.cargo.ExtCproductService;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

@Service
public class ExtCproductServiceImpl implements ExtCproductService {

    @Autowired
    private ExtCproductDao extCproductDao;
    @Autowired
    private ContractDao contractDao;

    @Override
    public void save(ExtCproduct extCproduct) {
//        1、计算附件的小计金额
//        2、修改合同上的附件数 +1
//        3、修改合同上的总金额 + 小计金额

//        计算小计金额
        double amount = extCproduct.getCnumber() * extCproduct.getPrice();
//        小计金额赋值到对象中
        extCproduct.setAmount(amount);
//        保存附件
        extCproductDao.insertSelective(extCproduct);
//        查询合同
        Contract contract = contractDao.selectByPrimaryKey(extCproduct.getContractId());
//        修改附件数
        contract.setExtNum(contract.getExtNum()+1);
//      修改总金额
        contract.setTotalAmount(contract.getTotalAmount()+amount);
//        保存合同
        contractDao.updateByPrimaryKeySelective(contract);

    }

    @Override
    public void update(ExtCproduct extCproduct) {
//    1、重新计算小计金额
//    2、查询这个附件之间的小计金额
//    3、修改合同上的总金额  需要获取这个附件之前的小计金额

//        重新计算小计金额
        double amount_new = extCproduct.getCnumber() * extCproduct.getPrice();
        //        小计金额赋值到对象中
        extCproduct.setAmount(amount_new);
//        趁现在数据库中的数据没有修改，根据id查询出目前表中的附件数据
        ExtCproduct extCproductOld = extCproductDao.selectByPrimaryKey(extCproduct.getId());
//        获取到了旧的小计金额
        Double amount_old = extCproductOld.getAmount();
//        这个时候就可以更新附件表
        extCproductDao.updateByPrimaryKeySelective(extCproduct);
        //        查询合同
        Contract contract = contractDao.selectByPrimaryKey(extCproduct.getContractId());
        //      修改总金额
        contract.setTotalAmount(contract.getTotalAmount()+amount_new-amount_old);
//        保存合同
        contractDao.updateByPrimaryKeySelective(contract);

    }

    @Override
    public void delete(String id) {
//        1、获取这个附件的小计金额
//        2、删除附件
//        3、修改合同附件数量
//        4、修改合同上总金额   - 删除附件的小计金额

//        获取这个附件的小计金额
        ExtCproduct extCproduct = extCproductDao.selectByPrimaryKey(id);
        Double amount = extCproduct.getAmount();
//        删除附件
        extCproductDao.deleteByPrimaryKey(id);
//        查询合同
        Contract contract = contractDao.selectByPrimaryKey(extCproduct.getContractId());
//        修改附件数
        contract.setExtNum(contract.getExtNum()-1);
//      修改总金额
        contract.setTotalAmount(contract.getTotalAmount()-amount);
//        保存合同
        contractDao.updateByPrimaryKeySelective(contract);
    }

    @Override
    public ExtCproduct findById(String id) {
        return extCproductDao.selectByPrimaryKey(id);
    }

    @Override
    public PageInfo findAll(ExtCproductExample example, int page, int size) {
        PageHelper.startPage(page,size);
        List<ExtCproduct> list = extCproductDao.selectByExample(example);
        return new PageInfo(list,5);
    }
}
